home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / cexpress / strings / wrapstrg.asm < prev   
Encoding:
Assembly Source File  |  1989-05-04  |  2.3 KB  |  86 lines

  1. ;void  wrap_string(strg,return_strg,length);
  2. ;  char  *strg,*return_strg;
  3. ;  unsigned short  length;
  4.  
  5.     EXTRN  _memory_model:byte
  6.  
  7. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  8.     ASSUME CS:_TEXT
  9.     PUBLIC _wrap_string
  10. _wrap_string proc near
  11.     cld            ;direction flag forward
  12.     push bp            ;
  13.     mov  bp,sp        ;set stack frame
  14.     push di            ;
  15.     push si            ;
  16.     push ds            ;
  17.     cmp  _memory_model,0    ;near or far?
  18.     jle  begin        ;jump if near
  19.     inc  bp            ;else add 2 to BP
  20.     inc  bp            ;
  21. begin:    cmp  _memory_model,2    ;data near or far?
  22.     jb   L0            ;jump if near    
  23.     lds  si,dword ptr[bp+4] ;DS:SI pts to Strg
  24.     les  di,dword ptr[bp+8] ;ES:DI pts to return string
  25.     add  bp,4        ;adjust pointer
  26.     jmp  short L1        ;jump ahead
  27. L0:    mov  si,[bp+4]        ;near case
  28.     mov  di,[bp+6]        ;
  29.     mov  ax,ds        ;ES = DS
  30.     mov  es,ax        ;
  31. L1:    mov  byte ptr es:[di],0    ;return null if error
  32.     cmp  byte ptr [si],0    ;null string?
  33.     je   L9            ;quit if so
  34. L2:    push si            ;save start positions
  35.     push di            ;
  36.     cld            ;direction forward
  37.     sub  cx,cx        ;CX counts length
  38. L3:    lodsb            ;copy entire string over
  39.     stosb            ;
  40.     inc  cx            ;inc length counter
  41.     or   al,al        ;null?
  42.     jne  L3            ;loop if not
  43.     pop  di            ;restore pointers
  44.     pop  si            ;
  45.     mov  bx,[bp+8]        ;get line length
  46.     cmp  bx,cx        ;is it in range?
  47.     jna  L4            ;jump if in range
  48.     mov  byte ptr[si],0    ;set source string to null
  49.     jmp  short L9        ;go quit program
  50. L4:    add  di,bx        ;point to end-point
  51.     dec  di            ;adjust to count from zero
  52.     mov  cx,[bp+8]        ;get line length
  53.     inc  cx            ;adjust
  54.     cmp  byte ptr es:[di+1],0 ;exact length required?
  55.     jne  L5            ;jump ahead if not
  56.     mov  byte ptr [si],0    ;else make source string null
  57.     jmp  short L9        ;all done, go quit
  58. L5:    cmp  byte ptr es:[di+1],32 ;next char is a space?
  59.     je   L7            ;jump ahead if so
  60.     mov  cx,[bp+8]        ;get line length
  61. L6:    cmp  byte ptr es:[di],32 ;space char?
  62.     je   L7            ;quit when find one
  63.     dec  di            ;pull pointer back one
  64.     dec  cx            ;dec length counter
  65.     jmp  short L6        ;loop
  66. L7:    mov  byte ptr es:[di+1],0 ;place terminating null
  67.     mov  di,si        ;point ES:DI to source
  68.     mov  ax,ds        ;
  69.     mov  es,ax        ;
  70.     add  si,cx        ;point SI to transfer point
  71. L8:    lodsb            ;shift down remaining chars
  72.     stosb            ;
  73.     or  al,al        ;null char yet?
  74.     jne L8            ;loop
  75. L9:    pop  ds            ;
  76.     pop  si            ;
  77.     pop  di            ;
  78.     pop  bp            ;
  79.     cmp  _memory_model,0    ;quit
  80.     jle  quit        ;
  81.     db   0CBh        ;RET far
  82. quit:    ret            ;RET near
  83. _wrap_string ENDP
  84. _TEXT    ENDS
  85.     END
  86.